package cn.tedu.work;

import com.rabbitmq.client.*;

import java.io.IOException;

public class WorkConsumer {
    public static void main(String[] args) throws Exception{
        //1.配置连接信息
        ConnectionFactory cf = new ConnectionFactory();
        cf.setHost("127.0.0.1");
        cf.setPort(5672);//5672是默认端口，可以省略
        cf.setUsername("guest");
        cf.setPassword("guest");
        //2.创建tcp连接对象
        Connection nc = cf.newConnection();
        //3.创建channel
        Channel cc = nc.createChannel();
        //4.创建队列
        /*
          第一个参数：队列名称
          第二个参数：队列是否持久化
          第三个参数：队列是否独占
          第四个参数：队列是否自动删除
          第五个参数：其他属性设置
         */
        cc.queueDeclare("task_queue",true,false,false,null);
        //5.消费数据
        /*
          第一个参数：队列名
          第二个参数：autoAck，先写成true
          第三个参数：deliverCallback 处理数据的回调函数
          第四个参数：cancelCallback  取消接收数据时的回调函数
         */
        //处理数据的回调函数
        DeliverCallback deliverCallback = new DeliverCallback() {
            @Override
            public void handle(String s, Delivery delivery) throws IOException {
                //消息封装在Delivery对象中
                byte[] body = delivery.getBody();
                String msg = new String(body);
                System.out.println("接收到消息："+msg);
                //处理msg的操作
                //遍历msg。遇到一个'.'就休息1s
                for (int i = 0; i < msg.length(); i++) {
                    if(msg.charAt(i)=='.'){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                System.out.println("消息处理完毕");
                //消息处理完毕，发送消息回执
                /*
                  第一个参数：消息回执标签
                  第二个参数：提交几条消息的回执消息，设置成false，表示提交一条消息的回执
                 */
                cc.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
            }
        };
        //取消接收时的回调函数
        CancelCallback cancelCallback = new CancelCallback() {
            @Override
            public void handle(String s) throws IOException {

            }
        };
        //设置消费者每次抓取一条消息进行消费
        cc.basicQos(1);
        cc.basicConsume("task_queue",false,deliverCallback,cancelCallback);
    }
}
